Prepare data

Read and format data

Prevalence

df_uk_covid$time %>% summary()
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    8.75   16.50   16.50   24.25   32.00 

Social distancing

df_uk_socdist$date %>% summary()
        Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
"2020-03-01" "2020-03-08" "2020-03-16" "2020-03-16" "2020-03-24" "2020-03-31" 

Controls

df_uk_ctrl_nuts <- read_csv("controls_UK_nuts3.csv")
Parsed with column specification:
cols(
  nuts3 = col_character(),
  nuts3_name = col_character(),
  airport_dist = col_double(),
  males = col_double(),
  popdens = col_double(),
  manufacturing = col_double(),
  tourism = col_double(),
  health = col_double(),
  academic = col_double(),
  medinc = col_double(),
  medage = col_double(),
  conservative = col_double()
)
df_uk_ctrl_nuts <- df_uk_ctrl_nuts %>% select(-nuts3_name)
df_uk_ctrl_nuts


df_uk_ctrl_ut <- read_csv("controls_UK_ut.csv")
Parsed with column specification:
cols(
  ut_area = col_character(),
  ut_name = col_character(),
  airport_dist = col_double(),
  males = col_double(),
  popdens = col_double(),
  manufacturing = col_double(),
  tourism = col_double(),
  health = col_double(),
  academic = col_double(),
  medinc = col_double(),
  medage = col_double(),
  conservative = col_double()
)
df_uk_ctrl_ut <- df_uk_ctrl_ut %>% select(-ut_name)
df_uk_ctrl_ut
NA
NA

Merge data


df_uk <- df_uk %>% plyr::join(df_uk_ctrl_ut, by='ut_area')

df_uk_socdist <- df_uk_socdist %>% plyr::join(df_uk_ctrl_nuts, by='nuts3')

Identify London areas


nuts_london_inner <- c('UKI31','UKI32','UKI33','UKI34','UKI41',
                      'UKI42','UKI43','UKI44','UKI45')

nuts_london_outer <- c('UKI51','UKI52','UKI53','UKI54','UKI61',
                      'UKI62','UKI63','UKI71','UKI72','UKI73',
                      'UKI74','UKI75')

ut_london_inner <- c('E09000007','E09000001','E09000033','E09000013',
                    'E09000020','E09000032','E09000025','E09000012',
                    'E09000030','E09000014','E09000019','E09000023',
                    'E09000028','E09000022')

ut_london_outer <- c('E09000011','E09000004','E09000016','E09000002',
                    'E09000031','E09000026','E09000010','E09000006',
                    'E09000008','E09000029','E09000021','E09000024',
                    'E09000003','E09000005','E09000009','E09000017',
                    'E09000015','E09000018','E09000027')

df_uk = df_uk %>% 
  mutate(london = ifelse(ut_area %in% ut_london_inner, 'london_inner', 
                       ifelse(ut_area %in% ut_london_outer, 'london_outer',
                              'country'))) %>%
  mutate(london = as.factor(london))

df_uk_socdist = df_uk_socdist %>% 
  mutate(london = ifelse(nuts3 %in% nuts_london_inner, 'london_inner', 
                       ifelse(nuts3 %in% nuts_london_outer, 'london_outer',
                              'country'))) %>%
  mutate(london = as.factor(london))

Explore data

Plot prevalence over time


df_uk %>% ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=ut_area, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_uk %>% mutate(prev_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=ut_area, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Plot social distancing over time


df_uk_socdist %>% ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_uk_socdist %>% mutate(socdist_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(socdist_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~socdist_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Explore differences between london and the rest


df_uk %>% ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=ut_area, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  facet_wrap(~london) +
  ggtitle("Overall prevalence over time")

NA
NA
NA
df_uk_socdist %>% ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  facet_wrap(~london) +
  ggtitle("Overall social distancing over time")

Control for weekend effect


weekend <- c(6, 7, 13, 14, 20, 21)

df_uk_loess <- df_uk_socdist %>% filter(!time %in% weekend) %>% 
  split(.$nuts3) %>%
  map(~ loess(socdist_single_tile ~ time, data = .)) %>%
  map(predict, 1:23) %>% 
  bind_rows() %>% 
  gather(key = 'nuts3', value = 'loess') %>% 
  group_by(nuts3) %>% 
  mutate(time = row_number())

df_uk_socdist <- df_uk_socdist %>% merge(df_uk_loess, by=c('nuts3', 'time')) %>% 
  mutate(socdist_single_tile_clean = ifelse(time %in% weekend, loess,
                                            socdist_single_tile)) %>%
  arrange(nuts3, time)


df_uk_socdist %>% ggplot(aes(x=time, y=loess, group=nuts3)) +
  geom_line()


df_uk_socdist
NA
NA

df_uk_socdist %>% ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_uk_socdist %>% mutate(socdist_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(socdist_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=nuts3, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~socdist_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}


df_uk_socdist <- df_uk_socdist %>% mutate(socdist_single_tile = socdist_single_tile_clean) %>% 
  select(-loess, -socdist_single_tile_clean)

Correlations


df_uk %>% group_by(ut_area) %>% 
  summarize_if(is.numeric, mean, na.rm=T) %>% 
  select(-ut_area, -time) %>% 
  cor(use = 'pairwise.complete') %>% round(3)
              pers_o pers_e pers_a pers_n pers_c  frequ rate_day airport_dist  males popdens
pers_o         1.000  0.734 -0.604 -0.143 -0.636  0.011    0.647       -0.247  0.437   0.806
pers_e         0.734  1.000 -0.412 -0.497 -0.293  0.071    0.559       -0.262  0.197   0.617
pers_a        -0.604 -0.412  1.000 -0.197  0.643  0.130   -0.584        0.285 -0.460  -0.745
pers_n        -0.143 -0.497 -0.197  1.000 -0.353 -0.243   -0.108        0.059  0.096   0.043
pers_c        -0.636 -0.293  0.643 -0.353  1.000  0.220   -0.487        0.327 -0.524  -0.727
frequ          0.011  0.071  0.130 -0.243  0.220  1.000   -0.077        0.108 -0.124  -0.180
rate_day       0.647  0.559 -0.584 -0.108 -0.487 -0.077    1.000       -0.388  0.302   0.758
airport_dist  -0.247 -0.262  0.285  0.059  0.327  0.108   -0.388        1.000 -0.124  -0.381
males          0.437  0.197 -0.460  0.096 -0.524 -0.124    0.302       -0.124  1.000   0.510
popdens        0.806  0.617 -0.745  0.043 -0.727 -0.180    0.758       -0.381  0.510   1.000
manufacturing -0.532 -0.595  0.496  0.359  0.363 -0.111   -0.511        0.300 -0.259  -0.545
tourism        0.116  0.098  0.069 -0.244  0.227  0.115   -0.023        0.448 -0.094  -0.099
health         0.089  0.026 -0.001  0.138 -0.286 -0.132   -0.010        0.150 -0.012   0.112
academic       0.707  0.730 -0.502 -0.447 -0.298  0.152    0.647       -0.369  0.267   0.602
medinc         0.533  0.569 -0.533 -0.335 -0.300  0.070    0.573       -0.379  0.367   0.631
medage        -0.508 -0.337  0.582 -0.167  0.780  0.144   -0.513        0.447 -0.620  -0.705
conservative  -0.843 -0.767  0.511  0.366  0.485 -0.125   -0.626        0.396 -0.293  -0.686
              manufacturing tourism health academic medinc medage conservative
pers_o               -0.532   0.116  0.089    0.707  0.533 -0.508       -0.843
pers_e               -0.595   0.098  0.026    0.730  0.569 -0.337       -0.767
pers_a                0.496   0.069 -0.001   -0.502 -0.533  0.582        0.511
pers_n                0.359  -0.244  0.138   -0.447 -0.335 -0.167        0.366
pers_c                0.363   0.227 -0.286   -0.298 -0.300  0.780        0.485
frequ                -0.111   0.115 -0.132    0.152  0.070  0.144       -0.125
rate_day             -0.511  -0.023 -0.010    0.647  0.573 -0.513       -0.626
airport_dist          0.300   0.448  0.150   -0.369 -0.379  0.447        0.396
males                -0.259  -0.094 -0.012    0.267  0.367 -0.620       -0.293
popdens              -0.545  -0.099  0.112    0.602  0.631 -0.705       -0.686
manufacturing         1.000  -0.088 -0.023   -0.714 -0.532  0.472        0.657
tourism              -0.088   1.000  0.049    0.056 -0.062  0.435       -0.023
health               -0.023   0.049  1.000   -0.228 -0.243 -0.153        0.043
academic             -0.714   0.056 -0.228    1.000  0.733 -0.382       -0.888
medinc               -0.532  -0.062 -0.243    0.733  1.000 -0.481       -0.661
medage                0.472   0.435 -0.153   -0.382 -0.481  1.000        0.486
conservative          0.657  -0.023  0.043   -0.888 -0.661  0.486        1.000
df_uk_socdist %>% group_by(nuts3) %>% 
  summarize_if(is.numeric, mean, na.rm=T) %>% 
  select(-nuts3, -time) %>% 
  cor(use = 'pairwise.complete') %>% round(3)
                    rate_day socdist_tiles socdist_single_tile pers_o pers_e pers_a pers_n pers_c  frequ
rate_day               1.000        -0.695               0.487  0.635  0.562 -0.567 -0.113 -0.469  0.078
socdist_tiles         -0.695         1.000              -0.619 -0.626 -0.733  0.545  0.325  0.395 -0.311
socdist_single_tile    0.487        -0.619               1.000  0.317  0.356 -0.382  0.040 -0.298  0.032
pers_o                 0.635        -0.626               0.317  1.000  0.713 -0.603 -0.122 -0.651  0.183
pers_e                 0.562        -0.733               0.356  0.713  1.000 -0.450 -0.456 -0.363  0.249
pers_a                -0.567         0.545              -0.382 -0.603 -0.450  1.000 -0.215  0.661 -0.030
pers_n                -0.113         0.325               0.040 -0.122 -0.456 -0.215  1.000 -0.338 -0.332
pers_c                -0.469         0.395              -0.298 -0.651 -0.363  0.661 -0.338  1.000  0.096
frequ                  0.078        -0.311               0.032  0.183  0.249 -0.030 -0.332  0.096  1.000
airport_dist          -0.353         0.550              -0.357 -0.231 -0.319  0.328  0.072  0.326 -0.147
males                  0.303        -0.287               0.077  0.519  0.243 -0.567  0.195 -0.632 -0.032
popdens                0.730        -0.705               0.500  0.803  0.638 -0.748  0.030 -0.737 -0.040
manufacturing         -0.412         0.668              -0.438 -0.496 -0.605  0.427  0.343  0.309 -0.278
tourism               -0.048         0.239              -0.110  0.079  0.005  0.142 -0.168  0.207 -0.007
health                 0.002         0.140              -0.060  0.086  0.047  0.005  0.151 -0.274 -0.258
academic               0.640        -0.808               0.348  0.713  0.742 -0.491 -0.432 -0.324  0.427
medinc                 0.600        -0.772               0.457  0.552  0.582 -0.620 -0.247 -0.367  0.248
medage                -0.472         0.563              -0.328 -0.512 -0.402  0.631 -0.181  0.790 -0.047
conservative          -0.629         0.757              -0.327 -0.837 -0.761  0.514  0.338  0.522 -0.374
                    airport_dist  males popdens manufacturing tourism health academic medinc medage
rate_day                  -0.353  0.303   0.730        -0.412  -0.048  0.002    0.640  0.600 -0.472
socdist_tiles              0.550 -0.287  -0.705         0.668   0.239  0.140   -0.808 -0.772  0.563
socdist_single_tile       -0.357  0.077   0.500        -0.438  -0.110 -0.060    0.348  0.457 -0.328
pers_o                    -0.231  0.519   0.803        -0.496   0.079  0.086    0.713  0.552 -0.512
pers_e                    -0.319  0.243   0.638        -0.605   0.005  0.047    0.742  0.582 -0.402
pers_a                     0.328 -0.567  -0.748         0.427   0.142  0.005   -0.491 -0.620  0.631
pers_n                     0.072  0.195   0.030         0.343  -0.168  0.151   -0.432 -0.247 -0.181
pers_c                     0.326 -0.632  -0.737         0.309   0.207 -0.274   -0.324 -0.367  0.790
frequ                     -0.147 -0.032  -0.040        -0.278  -0.007 -0.258    0.427  0.248 -0.047
airport_dist               1.000 -0.155  -0.377         0.272   0.492  0.180   -0.379 -0.389  0.469
males                     -0.155  1.000   0.615        -0.180  -0.171  0.028    0.263  0.440 -0.672
popdens                   -0.377  0.615   1.000        -0.492  -0.135  0.168    0.574  0.652 -0.714
manufacturing              0.272 -0.180  -0.492         1.000  -0.051 -0.069   -0.640 -0.462  0.413
tourism                    0.492 -0.171  -0.135        -0.051   1.000  0.027    0.005 -0.138  0.485
health                     0.180  0.028   0.168        -0.069   0.027  1.000   -0.202 -0.261 -0.154
academic                  -0.379  0.263   0.574        -0.640   0.005 -0.202    1.000  0.724 -0.368
medinc                    -0.389  0.440   0.652        -0.462  -0.138 -0.261    0.724  1.000 -0.479
medage                     0.469 -0.672  -0.714         0.413   0.485 -0.154   -0.368 -0.479  1.000
conservative               0.389 -0.350  -0.678         0.627   0.012  0.010   -0.891 -0.653  0.499
                    conservative
rate_day                  -0.629
socdist_tiles              0.757
socdist_single_tile       -0.327
pers_o                    -0.837
pers_e                    -0.761
pers_a                     0.514
pers_n                     0.338
pers_c                     0.522
frequ                     -0.374
airport_dist               0.389
males                     -0.350
popdens                   -0.678
manufacturing              0.627
tourism                    0.012
health                     0.010
academic                  -0.891
medinc                    -0.653
medage                     0.499
conservative               1.000

Modelling

Prepare functions


# function calculates all relevant models
run_models <- function(y, lvl1_x, lvl2_x, lvl2_id, data, ctrls=F){

  # subset data
  data = data %>% 
    dplyr::select(all_of(y), all_of(lvl1_x), all_of(lvl2_x), all_of(lvl2_id), 
                  popdens, rate_day, all_of(y))
  data = data %>% 
    dplyr::rename(y = all_of(y),
           lvl1_x = all_of(lvl1_x),
           lvl2_x = all_of(lvl2_x),
           lvl2_id = all_of(lvl2_id)
           )
  
  # configure optimization procedure
  ctrl_config <- lmeControl(opt = 'optim', maxIter = 100, msMaxIter = 100)

  # baseline
  baseline <- lme(fixed = y ~ 1, random = ~ 1 | lvl2_id, 
                    data = data,
                    correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept fixed slope
  random_intercept <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                          random = ~ 1 | lvl2_id,
                            data = data,
                            correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept random slope
  random_slope <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                      random = ~ lvl1_x | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction <- lme(fixed = y ~ lvl1_x * lvl2_x, 
                     random = ~ lvl1_x | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction)
  
  
  if (ctrls == 'dem' | ctrls == 'prev'){
    
    # random intercept random slope
    random_slope_ctrl_dem <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens,
                              random = ~ lvl1_x | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_main_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_int_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')        
    
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem)
  }
  
  if (ctrls == 'prev'){
  
    # random intercept random slope
    random_slope_ctrl_prev <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens + rate_day,
                              random = ~ lvl1_x + rate_day | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')  
    
        # cross level interaction
    interaction_ctrl_main_prev <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens + rate_day,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
  
    # cross level interaction
    interaction_ctrl_int_prev<- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens + rate_day,
                             random = ~ lvl1_x + rate_day | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')
  
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem,                    
                    "random_slope_ctrl_prev" = random_slope_ctrl_prev,
                    "interaction_ctrl_main_prev" = interaction_ctrl_main_prev,
                    "interaction_ctrl_int_prev" = interaction_ctrl_int_prev)
  }
  
  if(ctrls == 'exp'){
    # random intercept random slope
  random_slope_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) + lvl2_x, 
                      random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) * lvl2_x, 
                     random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')  
  
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction,                  
                  "random_slope_exp" = random_slope_exp,
                  "interaction_exp" = interaction_exp)
  }
  
  return(results)
        
}

# extracts table with coefficients and tests statistics
extract_results <- function(models) {
  
  models_summary <- models %>% 
  map(summary) %>% 
  map("tTable") %>% 
  map(as.data.frame) %>% 
  map(round, 10) 
  # %>% map(~ .[str_detect(rownames(.), 'Inter|lvl'),])
  
  return(models_summary)
  
}


# calculates comparison of all models in model list
compare_models <- function(models) {

  mdl_names <- models %>% names()
  
  str = ''
  for (i in mdl_names){
    
    mdl_str <- paste('models$', i, sep = '')
    
    if(i == 'baseline'){
      str <- mdl_str
    }else{
    str <- paste(str, mdl_str, sep=', ')
    }
  }
  
  anova_str <- paste0('anova(', str, ')')
  mdl_comp <- eval(parse(text=anova_str))
  rownames(mdl_comp) = mdl_names
  return(mdl_comp)
}

Remove London Data

# df_uk <- df_uk %>% filter(london == 'country')
# df_uk_socdist <- df_uk_socdist %>% filter(london == 'country')

Rescale Data

lvl2_scaled_ut <- df_uk %>% 
  dplyr::select(-time, -frequ, -rate_day, -london) %>% 
  distinct() %>% 
  mutate_at(vars(-ut_area), scale)

lvl1_scaled_ut <- df_uk %>% select(ut_area, time, rate_day) %>% 
  mutate_at(vars(-ut_area, -time), scale)

df_uk_scaled <- plyr::join(lvl1_scaled_ut, lvl2_scaled_ut, by = 'ut_area')

head(df_uk_scaled)

lvl2_scaled_nuts <- df_uk_socdist %>% 
  dplyr::select(-time, -date, -frequ, -london, 
                -socdist_tiles, -socdist_single_tile, -rate_day) %>% 
  distinct() %>% 
  mutate_at(vars(-nuts3), scale)

lvl1_scaled_nuts <- df_uk_socdist %>% select(nuts3, time, socdist_single_tile, rate_day) %>% 
  mutate_at(vars(-nuts3, -time), scale)

df_uk_socdist_scaled <- plyr::join(lvl1_scaled_nuts, lvl2_scaled_nuts, by = 'nuts3')

head(df_uk_socdist_scaled)
NA

Predict prevalence

prevalence ~ openness


models_o_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_o_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_covid)
NA

prevalence ~ conscientiousness


models_c_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_c_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_covid)
NA
NA

prevalence ~ extraversion


models_e_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_e_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_covid)
NA
NA

prevalence ~ agreeableness


models_a_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_a_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_covid)
NA
NA

prevalence ~ neuroticism


models_n_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'dem')

extract_results(models_n_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_covid)
NA
NA

Predict social distancing

social distancing ~ openness


models_o_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'prev')

extract_results(models_o_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_o_socdist)
NA

social distancing ~ conscientiousness


models_c_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'prev')

extract_results(models_c_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_c_socdist)
NA
NA

social distancing ~ extraversion


models_e_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'prev')

extract_results(models_e_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_e_socdist)
NA
NA

social distancing ~ agreeableness


models_a_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'prev')

extract_results(models_a_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_a_socdist)
NA
NA

social distancing ~ neuroticism


models_n_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'nuts3', 
                         data = df_uk_socdist_scaled,
                         ctrls = 'prev')

extract_results(models_n_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_n_socdist)
NA
NA

prevalence ~ conscientiousness


models_c_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_c_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_c_covid_exp)
NA

prevalence ~ extraversion


models_e_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_e_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_e_covid_exp)
NA

prevalence ~ agreeableness


models_a_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_a_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_a_covid_exp)
NA

prevalence ~ neuroticism


models_n_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'ut_area', 
                         data = df_uk_scaled,
                         ctrls = 'exp')

extract_results(models_n_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_n_covid_exp)
NA

Create overview table

Define function to create overview tables


summary_table <- function(models, dv_name, prev=F){

  temp_df_ctrl_main <- NULL
  temp_df_ctrl_int <- NULL
  temp_df_ctrl_int_prev <- NULL
  
  for (i in models){
    results <- i %>% extract_results()
    
    results_ctrl_main <- results$interaction_ctrl_main_dem['lvl1_x:lvl2_x',]
    temp_df_ctrl_main <- temp_df_ctrl_main %>% rbind(results_ctrl_main)
    
    results_ctrl_int <- results$interaction_ctrl_int_dem['lvl1_x:lvl2_x',]
    temp_df_ctrl_int <- temp_df_ctrl_int %>% rbind(results_ctrl_int)
    
    if(prev){
      results_ctrl_int_prev <- results$interaction_ctrl_int_prev['lvl1_x:lvl2_x',]
      temp_df_ctrl_int_prev <- temp_df_ctrl_int_prev %>% rbind(results_ctrl_int_prev)
    }
        
  }
  
  names_ctrl_main <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens')
  rownames(temp_df_ctrl_main) <- names_ctrl_main

  names_ctrl_int <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens*time')
  rownames(temp_df_ctrl_int) <- names_ctrl_int

  if(prev){
    names_ctrl_int_prev <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens*time_prev')
    rownames(temp_df_ctrl_int_prev) <- names_ctrl_int_prev
    
    sum_tab <- rbind(temp_df_ctrl_main, temp_df_ctrl_int, temp_df_ctrl_int_prev) %>% round(4)
  }else{
    sum_tab <- rbind(temp_df_ctrl_main, temp_df_ctrl_int) %>% round(4)
  }


  
  return(sum_tab)

} 

Create overview tables

# prevalence
models_prev <- list(models_o_covid, 
                    models_c_covid, 
                    models_e_covid, 
                    models_a_covid, 
                    models_n_covid)

sum_tab_prev <- summary_table(models_prev, dv_name = 'prev')

write.table(sum_tab_prev, quote=F)
Value Std.Error DF t-value p-value
prev~o*time_crtl_popdens 0.0448 0.0025 3127 17.8777 0
prev~c*time_crtl_popdens -0.0386 0.0025 3127 -15.1522 0
prev~e*time_crtl_popdens 0.0372 0.0026 3127 14.5749 0
prev~a*time_crtl_popdens -0.0425 0.0025 3127 -16.8501 0
prev~n*time_crtl_popdens -0.0031 0.0026 3127 -1.1684 0.2428
prev~o*time_crtl_popdens*time 1e-04 0.0041 3126 0.0267 0.9787
prev~c*time_crtl_popdens*time 0.0039 0.0035 3126 1.1107 0.2668
prev~e*time_crtl_popdens*time 0.0047 0.0031 3126 1.5126 0.1305
prev~a*time_crtl_popdens*time -0.0025 0.0036 3126 -0.6789 0.4972
prev~n*time_crtl_popdens*time -0.0055 0.0024 3126 -2.2661 0.0235
# social distancing
models_socdist <- list(models_o_socdist, 
                       models_c_socdist, 
                       models_e_socdist, 
                       models_a_socdist, 
                       models_n_socdist)

sum_tab_socdist <- summary_table(models_socdist, dv_name = 'socdist', prev=T)

write.table(sum_tab_socdist, quote=F)
Value Std.Error DF t-value p-value
socdist~o*time_crtl_popdens 0.0068 0.0018 2791 3.7749 2e-04
socdist~c*time_crtl_popdens -0.006 0.0018 2791 -3.3046 0.001
socdist~e*time_crtl_popdens 0.0073 0.0018 2791 4.0335 1e-04
socdist~a*time_crtl_popdens -0.0071 0.0018 2791 -3.9228 1e-04
socdist~n*time_crtl_popdens -9e-04 0.0018 2791 -0.5053 0.6134
socdist~o*time_crtl_popdens*time -0.0012 0.003 2790 -0.4016 0.688
socdist~c*time_crtl_popdens*time 0.0015 0.0026 2790 0.548 0.5837
socdist~e*time_crtl_popdens*time 0.0026 0.0023 2790 1.1082 0.2679
socdist~a*time_crtl_popdens*time -8e-04 0.0027 2790 -0.2856 0.7752
socdist~n*time_crtl_popdens*time -0.0012 0.0018 2790 -0.6676 0.5044
socdist~o*time_crtl_popdens*time_prev -0.0016 0.0029 2789 -0.5482 0.5836
socdist~c*time_crtl_popdens*time_prev 6e-04 0.0025 2789 0.2296 0.8184
socdist~e*time_crtl_popdens*time_prev 0.0018 0.0022 2789 0.806 0.4203
socdist~a*time_crtl_popdens*time_prev -5e-04 0.0026 2789 -0.1883 0.8507
socdist~n*time_crtl_popdens*time_prev -6e-04 0.0017 2789 -0.3241 0.7459

Conditional random forest analysis

Extract slopes prevalence


# slope prevalence
df_uk_slope_prev <- df_uk %>% split(.$ut_area) %>% 
  map(~ lm(rate_day ~ time, data = .)) %>%
  map(coef) %>% 
  map_dbl('time') %>% 
  as.data.frame() %>% 
  rownames_to_column('ut_area') %>% 
  rename(slope_prev = '.')

# merge with control variables 
df_uk_slope_prev <- df_uk %>% select(-time, -rate_day) %>%
  distinct() %>% 
  inner_join(df_uk_slope_prev, by = 'ut_area') %>%
  drop_na()

head(df_uk_slope_prev)
NA

Extract slopes social distancing


# slope socdist
df_uk_slope_socdist <- df_uk_socdist %>% split(.$nuts3) %>%
  map(~ lm(socdist_single_tile ~ time, data = .)) %>%
  map(coef) %>%
  map_dbl('time') %>%
  as.data.frame() %>%
  rownames_to_column('nuts3') %>%
  rename(slope_socdist = '.')

# merge with control variables 
df_uk_slope_socdist <- df_uk_socdist %>% select(-time, -date, -socdist_tiles, -socdist_single_tile) %>%
  distinct() %>%
  inner_join(df_uk_slope_socdist, by = 'nuts3') %>%
  drop_na()

head(df_uk_slope_socdist)
NA

Explore distribution of slopes

df_uk_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)


df_uk_slope_socdist %>% ggplot(aes(slope_socdist)) + geom_histogram(bins = 100)

df_uk_slope_prev

CRF prevalence ~ openness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_o_fit_prev <- cforest(slope_prev ~ pers_o + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_prev[-1], 
                         controls = ctrls)

crf_o_varimp_prev <- varimp(crf_o_fit_prev, nperm = 1)
crf_o_varimp_cond_prev <- varimp(crf_o_fit_prev, conditional = T, nperm = 1)

crf_o_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_o_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_c_fit_prev <- cforest(slope_prev ~ pers_c + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_prev[-1], 
                         controls = ctrls)

crf_c_varimp_prev <- varimp(crf_c_fit_prev, nperm = 1)
crf_c_varimp_cond_prev <- varimp(crf_c_fit_prev, conditional = T, nperm = 1)

crf_c_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_c_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ extraversion


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_e_fit_prev <- cforest(slope_prev ~ pers_e + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_prev[-1], 
                         controls = ctrls)

crf_e_varimp_prev <- varimp(crf_e_fit_prev, nperm = 1)
crf_e_varimp_cond_prev <- varimp(crf_e_fit_prev, conditional = T, nperm = 1)

crf_e_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_e_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ agreeableness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_a_fit_prev <- cforest(slope_prev ~ pers_a + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_prev[-1], 
                         controls = ctrls)

crf_a_varimp_prev <- varimp(crf_a_fit_prev, nperm = 1)
crf_a_varimp_cond_prev <- varimp(crf_a_fit_prev, conditional = T, nperm = 1)

crf_a_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_a_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ neuroticism


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_n_fit_prev <- cforest(slope_prev ~ pers_n + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_prev[-1], 
                         controls = ctrls)

crf_n_varimp_prev <- varimp(crf_n_fit_prev, nperm = 1)
crf_n_varimp_cond_prev <- varimp(crf_n_fit_prev, conditional = T, nperm = 1)

crf_n_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_n_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ openness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_o_fit_socdist <- cforest(slope_socdist ~ pers_o + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_socdist[-1], 
                         controls = ctrls)

crf_o_varimp_socdist <- varimp(crf_o_fit_socdist, nperm = 1)
crf_o_varimp_cond_socdist <- varimp(crf_o_fit_socdist, conditional = T, nperm = 1)

crf_o_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_o_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_c_fit_socdist <- cforest(slope_socdist ~ pers_c + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_socdist[-1], 
                         controls = ctrls)

crf_c_varimp_socdist <- varimp(crf_c_fit_socdist, nperm = 1)
crf_c_varimp_cond_socdist <- varimp(crf_c_fit_socdist, conditional = T, nperm = 1)

crf_c_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_c_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ extraversion


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_e_fit_socdist <- cforest(slope_socdist ~ pers_e + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_socdist[-1], 
                         controls = ctrls)

crf_e_varimp_socdist <- varimp(crf_e_fit_socdist, nperm = 1)
crf_e_varimp_cond_socdist <- varimp(crf_e_fit_socdist, conditional = T, nperm = 1)

crf_e_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_e_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ agreeableness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_a_fit_socdist <- cforest(slope_socdist ~ pers_a + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_socdist[-1], 
                         controls = ctrls)

crf_a_varimp_socdist <- varimp(crf_a_fit_socdist, nperm = 1)
crf_a_varimp_cond_socdist <- varimp(crf_a_fit_socdist, conditional = T, nperm = 1)

crf_a_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_a_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ neuroticism


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_n_fit_socdist <- cforest(slope_socdist ~ pers_n + airport_dist + males +
                          popdens + manufacturing + tourism +
                          health + academic + medinc + medage + conservative, 
                         df_uk_slope_socdist[-1], 
                         controls = ctrls)

crf_n_varimp_socdist <- varimp(crf_n_fit_socdist, nperm = 1)
crf_n_varimp_cond_socdist <- varimp(crf_n_fit_socdist, conditional = T, nperm = 1)

crf_n_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_n_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

LS0tCnRpdGxlOiAiQ09WSUQxOSBVSyIKYXV0aG9yOiAiSGVpbnJpY2ggUGV0ZXJzIgpkYXRlOiAiNC8yMy8yMDIwIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCiMgTUFDCiBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGF0YS9VSycpCiAKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShubG1lKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHh0YWJsZSkKCmBgYAoKIyBQcmVwYXJlIGRhdGEKCiMjIyBSZWFkIGFuZCBmb3JtYXQgZGF0YQoKIyMjIFByZXZhbGVuY2UgCmBgYHtyfQoKZGZfdWtfY292aWQgPC0gcmVhZF9jc3YoJ3RpbWVzZXJpZXNfdWtfdXRsYV9tYXJjaDlfYXByaWxfMDkuY3N2JykKZGZfdWtfY292aWQkdGltZSAlPiUgc3VtbWFyeSgpCgpkZl91ayA8LSBkZl91a19jb3ZpZCAlPiUgZmlsdGVyKHRpbWUgPD0yMikgJT4lIAogIGRwbHlyOjpyZW5hbWUocGVyc19vID0gb3BlbiwgCiAgICAgICAgIHBlcnNfYyA9IHNjaSwKICAgICAgICAgcGVyc19lID0gZXh0cmEsCiAgICAgICAgIHBlcnNfYSA9IGFncmVlLAogICAgICAgICBwZXJzX24gPSBuZXVybykgJT4lCiAgc2VsZWN0KC11dF9uYW1lLCAtYXJlYW5hbWUsIC1wb3B0b3RhbCkgJT4lCiAgZHJvcF9uYSgpCgpkZl91ayAlPiUgaGVhZCgpCgpgYGAKCiMjIyBTb2NpYWwgZGlzdGFuY2luZwpgYGB7cn0KCmRmX3VrX3NvY2Rpc3QgPC0gcmVhZF9jc3YoJ1VLX3NvY2Rpc3RfZmJfbnV0czMuY3N2JykKZGZfdWtfc29jZGlzdCRkYXRlICU+JSBzdW1tYXJ5KCkKCmRmX3VrX3NvY2Rpc3QgPC0gZGZfdWtfc29jZGlzdCAlPiUgc2VsZWN0KC1ydW5kYXkpICU+JQogIGZpbHRlcihkYXRlID49ICcyMDIwLTAzLTA5JyAmIGRhdGUgPD0gJzIwMjAtMDMtMzEnKSAlPiUKICBncm91cF9ieShudXRzMykgJT4lIAogIG11dGF0ZSh0aW1lID0gcm93X251bWJlcigpKSAlPiUKICB1bmdyb3VwKCkgJT4lIAogIGRwbHlyOjpyZW5hbWUocGVyc19vID0gb3BlbiwgCiAgICAgICAgICAgICAgICBwZXJzX2MgPSBzY2ksCiAgICAgICAgICAgICAgICBwZXJzX2UgPSBleHRyYSwKICAgICAgICAgICAgICAgIHBlcnNfYSA9IGFncmVlLAogICAgICAgICAgICAgICAgcGVyc19uID0gbmV1cm8pICU+JSAKICBzZWxlY3QoLW51dHMzX25hbWUpICU+JSAKICBkcGx5cjo6cmVuYW1lKHNvY2Rpc3RfdGlsZXMgPSBhbGxfZGF5X2JpbmdfdGlsZXNfdmlzaXRlZF9yZWxhdCwKICAgICAgICAgICAgICAgIHNvY2Rpc3Rfc2luZ2xlX3RpbGUgPSBhbGxfZGF5X3JhdGlvX3NpbmdsZV90aWxlX3VzZXJzKSAlPiUKICBkcm9wX25hKCkKCm51dHNfdXRfa2V5IDwtIHJlYWRfY3N2KCdudXRzM191dC5jc3YnKQoKZGZfdWtfc29jZGlzdCA8LSBudXRzX3V0X2tleSAlPiUgCiAgcGx5cjo6am9pbihzZWxlY3QoZGZfdWssIHV0X2FyZWEsIHRpbWUsIHJhdGVfZGF5KSwgYnkgPSAndXRfYXJlYScpICU+JQogIHBseXI6OmpvaW4oZGZfdWtfc29jZGlzdCwgYnkgPSBjKCdudXRzMycsICd0aW1lJykpICU+JSAKICBzZWxlY3QoLXV0X2FyZWEpCgpkZl91a19zb2NkaXN0ICU+JSBoZWFkKCkKCmBgYAoKIyMjIENvbnRyb2xzIApgYGB7cn0KZGZfdWtfY3RybF9udXRzIDwtIHJlYWRfY3N2KCJjb250cm9sc19VS19udXRzMy5jc3YiKQpkZl91a19jdHJsX251dHMgPC0gZGZfdWtfY3RybF9udXRzICU+JSBzZWxlY3QoLW51dHMzX25hbWUpCmRmX3VrX2N0cmxfbnV0cwoKCmRmX3VrX2N0cmxfdXQgPC0gcmVhZF9jc3YoImNvbnRyb2xzX1VLX3V0LmNzdiIpCmRmX3VrX2N0cmxfdXQgPC0gZGZfdWtfY3RybF91dCAlPiUgc2VsZWN0KC11dF9uYW1lKQpkZl91a19jdHJsX3V0CgoKYGBgCgojIyMgTWVyZ2UgZGF0YSAKYGBge3J9CgpkZl91ayA8LSBkZl91ayAlPiUgcGx5cjo6am9pbihkZl91a19jdHJsX3V0LCBieT0ndXRfYXJlYScpCgpkZl91a19zb2NkaXN0IDwtIGRmX3VrX3NvY2Rpc3QgJT4lIHBseXI6OmpvaW4oZGZfdWtfY3RybF9udXRzLCBieT0nbnV0czMnKQoKCmBgYAoKCiMjIyBJZGVudGlmeSBMb25kb24gYXJlYXMKYGBge3J9CgpudXRzX2xvbmRvbl9pbm5lciA8LSBjKCdVS0kzMScsJ1VLSTMyJywnVUtJMzMnLCdVS0kzNCcsJ1VLSTQxJywKICAgICAgICAgICAgICAgICAgICAgICdVS0k0MicsJ1VLSTQzJywnVUtJNDQnLCdVS0k0NScpCgpudXRzX2xvbmRvbl9vdXRlciA8LSBjKCdVS0k1MScsJ1VLSTUyJywnVUtJNTMnLCdVS0k1NCcsJ1VLSTYxJywKICAgICAgICAgICAgICAgICAgICAgICdVS0k2MicsJ1VLSTYzJywnVUtJNzEnLCdVS0k3MicsJ1VLSTczJywKICAgICAgICAgICAgICAgICAgICAgICdVS0k3NCcsJ1VLSTc1JykKCnV0X2xvbmRvbl9pbm5lciA8LSBjKCdFMDkwMDAwMDcnLCdFMDkwMDAwMDEnLCdFMDkwMDAwMzMnLCdFMDkwMDAwMTMnLAogICAgICAgICAgICAgICAgICAgICdFMDkwMDAwMjAnLCdFMDkwMDAwMzInLCdFMDkwMDAwMjUnLCdFMDkwMDAwMTInLAogICAgICAgICAgICAgICAgICAgICdFMDkwMDAwMzAnLCdFMDkwMDAwMTQnLCdFMDkwMDAwMTknLCdFMDkwMDAwMjMnLAogICAgICAgICAgICAgICAgICAgICdFMDkwMDAwMjgnLCdFMDkwMDAwMjInKQoKdXRfbG9uZG9uX291dGVyIDwtIGMoJ0UwOTAwMDAxMScsJ0UwOTAwMDAwNCcsJ0UwOTAwMDAxNicsJ0UwOTAwMDAwMicsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAzMScsJ0UwOTAwMDAyNicsJ0UwOTAwMDAxMCcsJ0UwOTAwMDAwNicsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAwOCcsJ0UwOTAwMDAyOScsJ0UwOTAwMDAyMScsJ0UwOTAwMDAyNCcsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAwMycsJ0UwOTAwMDAwNScsJ0UwOTAwMDAwOScsJ0UwOTAwMDAxNycsCiAgICAgICAgICAgICAgICAgICAgJ0UwOTAwMDAxNScsJ0UwOTAwMDAxOCcsJ0UwOTAwMDAyNycpCmBgYAoKYGBge3J9CgpkZl91ayA9IGRmX3VrICU+JSAKICBtdXRhdGUobG9uZG9uID0gaWZlbHNlKHV0X2FyZWEgJWluJSB1dF9sb25kb25faW5uZXIsICdsb25kb25faW5uZXInLCAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodXRfYXJlYSAlaW4lIHV0X2xvbmRvbl9vdXRlciwgJ2xvbmRvbl9vdXRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3VudHJ5JykpKSAlPiUKICBtdXRhdGUobG9uZG9uID0gYXMuZmFjdG9yKGxvbmRvbikpCgpkZl91a19zb2NkaXN0ID0gZGZfdWtfc29jZGlzdCAlPiUgCiAgbXV0YXRlKGxvbmRvbiA9IGlmZWxzZShudXRzMyAlaW4lIG51dHNfbG9uZG9uX2lubmVyLCAnbG9uZG9uX2lubmVyJywgCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG51dHMzICVpbiUgbnV0c19sb25kb25fb3V0ZXIsICdsb25kb25fb3V0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY291bnRyeScpKSkgJT4lCiAgbXV0YXRlKGxvbmRvbiA9IGFzLmZhY3Rvcihsb25kb24pKQoKYGBgCgoKIyBFeHBsb3JlIGRhdGEKCiMjIyBQbG90IHByZXZhbGVuY2Ugb3ZlciB0aW1lCmBgYHtyfQoKZGZfdWsgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXJhdGVfZGF5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9dXRfYXJlYSwgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBwcmV2YWxlbmNlIG92ZXIgdGltZSIpCgpwZXJzIDwtIGMoJ3BlcnNfbycsICdwZXJzX2MnLCAncGVyc19lJywgJ3BlcnNfYScsICdwZXJzX24nKQoKZm9yIChpIGluIHBlcnMpewoKZ2cgPC0gZGZfdWsgJT4lIG11dGF0ZShwcmV2X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihwcmV2X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXJhdGVfZGF5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9dXRfYXJlYSwgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5wcmV2X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CgpgYGAKCgojIyMgUGxvdCBzb2NpYWwgZGlzdGFuY2luZyBvdmVyIHRpbWUKYGBge3J9CgpkZl91a19zb2NkaXN0ICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9bnV0czMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgc29jaWFsIGRpc3RhbmNpbmcgb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl91a19zb2NkaXN0ICU+JSBtdXRhdGUoc29jZGlzdF90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjIpLCBxdWFudGlsZSguW1tpXV0sIDAuOCksIEluZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIoc29jZGlzdF90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9bnV0czMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+c29jZGlzdF90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgojIyMgRXhwbG9yZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGxvbmRvbiBhbmQgdGhlIHJlc3QgCmBgYHtyfQoKZGZfdWsgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXJhdGVfZGF5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9dXRfYXJlYSwgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZmFjZXRfd3JhcCh+bG9uZG9uKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBwcmV2YWxlbmNlIG92ZXIgdGltZSIpCgoKCmBgYAoKCmBgYHtyfQpkZl91a19zb2NkaXN0ICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9bnV0czMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGZhY2V0X3dyYXAofmxvbmRvbikgKwogIGdndGl0bGUoIk92ZXJhbGwgc29jaWFsIGRpc3RhbmNpbmcgb3ZlciB0aW1lIikKYGBgCgojIyMgQ29udHJvbCBmb3Igd2Vla2VuZCBlZmZlY3QgCmBgYHtyfQoKd2Vla2VuZCA8LSBjKDYsIDcsIDEzLCAxNCwgMjAsIDIxKQoKZGZfdWtfbG9lc3MgPC0gZGZfdWtfc29jZGlzdCAlPiUgZmlsdGVyKCF0aW1lICVpbiUgd2Vla2VuZCkgJT4lIAogIHNwbGl0KC4kbnV0czMpICU+JQogIG1hcCh+IGxvZXNzKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChwcmVkaWN0LCAxOjIzKSAlPiUgCiAgYmluZF9yb3dzKCkgJT4lIAogIGdhdGhlcihrZXkgPSAnbnV0czMnLCB2YWx1ZSA9ICdsb2VzcycpICU+JSAKICBncm91cF9ieShudXRzMykgJT4lIAogIG11dGF0ZSh0aW1lID0gcm93X251bWJlcigpKQoKZGZfdWtfc29jZGlzdCA8LSBkZl91a19zb2NkaXN0ICU+JSBtZXJnZShkZl91a19sb2VzcywgYnk9YygnbnV0czMnLCAndGltZScpKSAlPiUgCiAgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4gPSBpZmVsc2UodGltZSAlaW4lIHdlZWtlbmQsIGxvZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSAlPiUKICBhcnJhbmdlKG51dHMzLCB0aW1lKQoKCmRmX3VrX3NvY2Rpc3QgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PWxvZXNzLCBncm91cD1udXRzMykpICsKICBnZW9tX2xpbmUoKQoKZGZfdWtfc29jZGlzdAoKCmBgYAoKYGBge3J9CgpkZl91a19zb2NkaXN0ICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9bnV0czMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgc29jaWFsIGRpc3RhbmNpbmcgb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl91a19zb2NkaXN0ICU+JSBtdXRhdGUoc29jZGlzdF90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjIpLCBxdWFudGlsZSguW1tpXV0sIDAuOCksIEluZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIoc29jZGlzdF90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9bnV0czMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+c29jZGlzdF90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgpgYGB7cn0KCmRmX3VrX3NvY2Rpc3QgPC0gZGZfdWtfc29jZGlzdCAlPiUgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgPSBzb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKSAlPiUgCiAgc2VsZWN0KC1sb2VzcywgLXNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4pCgpgYGAKCiMjIyBDb3JyZWxhdGlvbnMKYGBge3J9CgpkZl91ayAlPiUgZ3JvdXBfYnkodXRfYXJlYSkgJT4lIAogIHN1bW1hcml6ZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybT1UKSAlPiUgCiAgc2VsZWN0KC11dF9hcmVhLCAtdGltZSkgJT4lIAogIGNvcih1c2UgPSAncGFpcndpc2UuY29tcGxldGUnKSAlPiUgcm91bmQoMykKCmRmX3VrX3NvY2Rpc3QgJT4lIGdyb3VwX2J5KG51dHMzKSAlPiUgCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtPVQpICU+JSAKICBzZWxlY3QoLW51dHMzLCAtdGltZSkgJT4lIAogIGNvcih1c2UgPSAncGFpcndpc2UuY29tcGxldGUnKSAlPiUgcm91bmQoMykKCmBgYAoKIyBNb2RlbGxpbmcgCiMjIFByZXBhcmUgZnVuY3Rpb25zCgpgYGB7cn0KCiMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbGwgcmVsZXZhbnQgbW9kZWxzCnJ1bl9tb2RlbHMgPC0gZnVuY3Rpb24oeSwgbHZsMV94LCBsdmwyX3gsIGx2bDJfaWQsIGRhdGEsIGN0cmxzPUYpewoKICAjIHN1YnNldCBkYXRhCiAgZGF0YSA9IGRhdGEgJT4lIAogICAgZHBseXI6OnNlbGVjdChhbGxfb2YoeSksIGFsbF9vZihsdmwxX3gpLCBhbGxfb2YobHZsMl94KSwgYWxsX29mKGx2bDJfaWQpLCAKICAgICAgICAgICAgICAgICAgcG9wZGVucywgcmF0ZV9kYXksIGFsbF9vZih5KSkKICBkYXRhID0gZGF0YSAlPiUgCiAgICBkcGx5cjo6cmVuYW1lKHkgPSBhbGxfb2YoeSksCiAgICAgICAgICAgbHZsMV94ID0gYWxsX29mKGx2bDFfeCksCiAgICAgICAgICAgbHZsMl94ID0gYWxsX29mKGx2bDJfeCksCiAgICAgICAgICAgbHZsMl9pZCA9IGFsbF9vZihsdmwyX2lkKQogICAgICAgICAgICkKICAKICAjIGNvbmZpZ3VyZSBvcHRpbWl6YXRpb24gcHJvY2VkdXJlCiAgY3RybF9jb25maWcgPC0gbG1lQ29udHJvbChvcHQgPSAnb3B0aW0nLCBtYXhJdGVyID0gMTAwLCBtc01heEl0ZXIgPSAxMDApCgogICMgYmFzZWxpbmUKICBiYXNlbGluZSA8LSBsbWUoZml4ZWQgPSB5IH4gMSwgcmFuZG9tID0gfiAxIHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQoKICAjIHJhbmRvbSBpbnRlcmNlcHQgZml4ZWQgc2xvcGUKICByYW5kb21faW50ZXJjZXB0IDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gMSB8IGx2bDJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyByYW5kb20gaW50ZXJjZXB0IHJhbmRvbSBzbG9wZQogIHJhbmRvbV9zbG9wZSA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICsgbHZsMl94LCAKICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCgogICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICBpbnRlcmFjdGlvbiA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94LCAKICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgIyBjcmVhdGUgbGlzdCB3aXRoIHJlc3VsdHMKICByZXN1bHRzIDwtIGxpc3QoJ2Jhc2VsaW5lJyA9IGJhc2VsaW5lLCAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9pbnRlcmNlcHQiID0gcmFuZG9tX2ludGVyY2VwdCwgCiAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGUiID0gcmFuZG9tX3Nsb3BlLAogICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb24iID0gaW50ZXJhY3Rpb24pCiAgCiAgCiAgaWYgKGN0cmxzID09ICdkZW0nIHwgY3RybHMgPT0gJ3ByZXYnKXsKICAgIAogICAgIyByYW5kb20gaW50ZXJjZXB0IHJhbmRvbSBzbG9wZQogICAgcmFuZG9tX3Nsb3BlX2N0cmxfZGVtIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3ggKyBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94ICsgcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAgICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICAgIGludGVyYWN0aW9uX2N0cmxfaW50X2RlbSA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94ICsgbHZsMV94ICogcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykgICAgICAgIAogICAgCiAgICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogICAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9pbnRlcmNlcHQiID0gcmFuZG9tX2ludGVyY2VwdCwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGVfY3RybF9kZW0iID0gcmFuZG9tX3Nsb3BlX2N0cmxfZGVtLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfaW50X2RlbSIgPSBpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0pCiAgfQogIAogIGlmIChjdHJscyA9PSAncHJldicpewogIAogICAgIyByYW5kb20gaW50ZXJjZXB0IHJhbmRvbSBzbG9wZQogICAgcmFuZG9tX3Nsb3BlX2N0cmxfcHJldiA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICsgbHZsMl94ICsgcG9wZGVucyArIHJhdGVfZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCArIHJhdGVfZGF5IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpICAKICAgIAogICAgICAgICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICAgIGludGVyYWN0aW9uX2N0cmxfbWFpbl9wcmV2IDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBwb3BkZW5zICsgcmF0ZV9kYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgCiAgICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgICBpbnRlcmFjdGlvbl9jdHJsX2ludF9wcmV2PC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCAqIGx2bDJfeCArIGx2bDFfeCAqIHBvcGRlbnMgKyByYXRlX2RheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCArIHJhdGVfZGF5IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogICAgIyBjcmVhdGUgbGlzdCB3aXRoIHJlc3VsdHMKICAgIHJlc3VsdHMgPC0gbGlzdCgnYmFzZWxpbmUnID0gYmFzZWxpbmUsIAogICAgICAgICAgICAgICAgICAgICJyYW5kb21faW50ZXJjZXB0IiA9IHJhbmRvbV9pbnRlcmNlcHQsIAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGUiID0gcmFuZG9tX3Nsb3BlLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbiIgPSBpbnRlcmFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2N0cmxfZGVtIiA9IHJhbmRvbV9zbG9wZV9jdHJsX2RlbSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSIgPSBpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0iID0gaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtLCAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZV9jdHJsX3ByZXYiID0gcmFuZG9tX3Nsb3BlX2N0cmxfcHJldiwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9tYWluX3ByZXYiID0gaW50ZXJhY3Rpb25fY3RybF9tYWluX3ByZXYsCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfaW50X3ByZXYiID0gaW50ZXJhY3Rpb25fY3RybF9pbnRfcHJldikKICB9CiAgCiAgaWYoY3RybHMgPT0gJ2V4cCcpewogICAgIyByYW5kb20gaW50ZXJjZXB0IHJhbmRvbSBzbG9wZQogIHJhbmRvbV9zbG9wZV9leHAgPC0gbG1lKGZpeGVkID0geSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgKyBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAobHZsMV94ICsgSShsdmwxX3heMikpIHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCgogICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICBpbnRlcmFjdGlvbl9leHAgPC0gbG1lKGZpeGVkID0geSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgKiBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpICAKICAKICAKICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogIHJlc3VsdHMgPC0gbGlzdCgnYmFzZWxpbmUnID0gYmFzZWxpbmUsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbiIgPSBpbnRlcmFjdGlvbiwgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZV9leHAiID0gcmFuZG9tX3Nsb3BlX2V4cCwKICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2V4cCIgPSBpbnRlcmFjdGlvbl9leHApCiAgfQogIAogIHJldHVybihyZXN1bHRzKQogICAgICAgIAp9CgojIGV4dHJhY3RzIHRhYmxlIHdpdGggY29lZmZpY2llbnRzIGFuZCB0ZXN0cyBzdGF0aXN0aWNzCmV4dHJhY3RfcmVzdWx0cyA8LSBmdW5jdGlvbihtb2RlbHMpIHsKICAKICBtb2RlbHNfc3VtbWFyeSA8LSBtb2RlbHMgJT4lIAogIG1hcChzdW1tYXJ5KSAlPiUgCiAgbWFwKCJ0VGFibGUiKSAlPiUgCiAgbWFwKGFzLmRhdGEuZnJhbWUpICU+JSAKICBtYXAocm91bmQsIDEwKSAKICAjICU+JSBtYXAofiAuW3N0cl9kZXRlY3Qocm93bmFtZXMoLiksICdJbnRlcnxsdmwnKSxdKQogIAogIHJldHVybihtb2RlbHNfc3VtbWFyeSkKICAKfQoKCiMgY2FsY3VsYXRlcyBjb21wYXJpc29uIG9mIGFsbCBtb2RlbHMgaW4gbW9kZWwgbGlzdApjb21wYXJlX21vZGVscyA8LSBmdW5jdGlvbihtb2RlbHMpIHsKCiAgbWRsX25hbWVzIDwtIG1vZGVscyAlPiUgbmFtZXMoKQogIAogIHN0ciA9ICcnCiAgZm9yIChpIGluIG1kbF9uYW1lcyl7CiAgICAKICAgIG1kbF9zdHIgPC0gcGFzdGUoJ21vZGVscyQnLCBpLCBzZXAgPSAnJykKICAgIAogICAgaWYoaSA9PSAnYmFzZWxpbmUnKXsKICAgICAgc3RyIDwtIG1kbF9zdHIKICAgIH1lbHNlewogICAgc3RyIDwtIHBhc3RlKHN0ciwgbWRsX3N0ciwgc2VwPScsICcpCiAgICB9CiAgfQogIAogIGFub3ZhX3N0ciA8LSBwYXN0ZTAoJ2Fub3ZhKCcsIHN0ciwgJyknKQogIG1kbF9jb21wIDwtIGV2YWwocGFyc2UodGV4dD1hbm92YV9zdHIpKQogIHJvd25hbWVzKG1kbF9jb21wKSA9IG1kbF9uYW1lcwogIHJldHVybihtZGxfY29tcCkKfQoKCmBgYAoKIyMgUmVtb3ZlIExvbmRvbiBEYXRhIApgYGB7cn0KIyBkZl91ayA8LSBkZl91ayAlPiUgZmlsdGVyKGxvbmRvbiA9PSAnY291bnRyeScpCiMgZGZfdWtfc29jZGlzdCA8LSBkZl91a19zb2NkaXN0ICU+JSBmaWx0ZXIobG9uZG9uID09ICdjb3VudHJ5JykKCmBgYAoKCgojIyBSZXNjYWxlIERhdGEKYGBge3J9Cmx2bDJfc2NhbGVkX3V0IDwtIGRmX3VrICU+JSAKICBkcGx5cjo6c2VsZWN0KC10aW1lLCAtZnJlcXUsIC1yYXRlX2RheSwgLWxvbmRvbikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC11dF9hcmVhKSwgc2NhbGUpCgpsdmwxX3NjYWxlZF91dCA8LSBkZl91ayAlPiUgc2VsZWN0KHV0X2FyZWEsIHRpbWUsIHJhdGVfZGF5KSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLXV0X2FyZWEsIC10aW1lKSwgc2NhbGUpCgpkZl91a19zY2FsZWQgPC0gcGx5cjo6am9pbihsdmwxX3NjYWxlZF91dCwgbHZsMl9zY2FsZWRfdXQsIGJ5ID0gJ3V0X2FyZWEnKQoKaGVhZChkZl91a19zY2FsZWQpCmBgYAoKCmBgYHtyfQoKbHZsMl9zY2FsZWRfbnV0cyA8LSBkZl91a19zb2NkaXN0ICU+JSAKICBkcGx5cjo6c2VsZWN0KC10aW1lLCAtZGF0ZSwgLWZyZXF1LCAtbG9uZG9uLCAKICAgICAgICAgICAgICAgIC1zb2NkaXN0X3RpbGVzLCAtc29jZGlzdF9zaW5nbGVfdGlsZSwgLXJhdGVfZGF5KSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLW51dHMzKSwgc2NhbGUpCgpsdmwxX3NjYWxlZF9udXRzIDwtIGRmX3VrX3NvY2Rpc3QgJT4lIHNlbGVjdChudXRzMywgdGltZSwgc29jZGlzdF9zaW5nbGVfdGlsZSwgcmF0ZV9kYXkpICU+JSAKICBtdXRhdGVfYXQodmFycygtbnV0czMsIC10aW1lKSwgc2NhbGUpCgpkZl91a19zb2NkaXN0X3NjYWxlZCA8LSBwbHlyOjpqb2luKGx2bDFfc2NhbGVkX251dHMsIGx2bDJfc2NhbGVkX251dHMsIGJ5ID0gJ251dHMzJykKCmhlYWQoZGZfdWtfc29jZGlzdF9zY2FsZWQpCgpgYGAKCgoKIyMgUHJlZGljdCBwcmV2YWxlbmNlCiMjIyBwcmV2YWxlbmNlIH4gb3Blbm5lc3MKYGBge3J9Cgptb2RlbHNfb19jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX28nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX29fY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfb19jb3ZpZCkKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBjb25zY2llbnRpb3VzbmVzcwpgYGB7cn0KCm1vZGVsc19jX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfY19jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19jX2NvdmlkKQoKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBleHRyYXZlcnNpb24KYGBge3J9Cgptb2RlbHNfZV9jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2VfY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfZV9jb3ZpZCkKCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gYWdyZWVhYmxlbmVzcwpgYGB7cn0KCm1vZGVsc19hX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfYV9jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19hX2NvdmlkKQoKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBuZXVyb3RpY2lzbQpgYGB7cn0KCm1vZGVsc19uX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfbl9jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19uX2NvdmlkKQoKCmBgYAoKCiMjIFByZWRpY3Qgc29jaWFsIGRpc3RhbmNpbmcKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gb3Blbm5lc3MKYGBge3J9Cgptb2RlbHNfb19zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3Rfc2luZ2xlX3RpbGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19vJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ251dHMzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc29jZGlzdF9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdwcmV2JykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfb19zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX29fc29jZGlzdCkKCmBgYAoKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9Cgptb2RlbHNfY19zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3Rfc2luZ2xlX3RpbGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19jJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ251dHMzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc29jZGlzdF9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdwcmV2JykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfY19zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2Nfc29jZGlzdCkKCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCm1vZGVsc19lX3NvY2Rpc3QgPC1ydW5fbW9kZWxzKHkgPSAnc29jZGlzdF9zaW5nbGVfdGlsZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAnbnV0czMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zb2NkaXN0X3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ3ByZXYnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19lX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfZV9zb2NkaXN0KQoKCmBgYAoKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gYWdyZWVhYmxlbmVzcwpgYGB7cn0KCm1vZGVsc19hX3NvY2Rpc3QgPC1ydW5fbW9kZWxzKHkgPSAnc29jZGlzdF9zaW5nbGVfdGlsZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAnbnV0czMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zb2NkaXN0X3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ3ByZXYnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfYV9zb2NkaXN0KQoKCmBgYAoKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gbmV1cm90aWNpc20KYGBge3J9Cgptb2RlbHNfbl9zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3Rfc2luZ2xlX3RpbGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19uJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ251dHMzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdWtfc29jZGlzdF9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdwcmV2JykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfbl9zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX25fc29jZGlzdCkKCgpgYGAKCgojIyBFeHBsb3JlIHF1YWRyYXRpYyB0cmVuZHMgCgojIyMgcHJldmFsZW5jZSB+IG9wZW5uZXNzCmBgYHtyfQoKbW9kZWxzX29fY292aWRfZXhwIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX28nLAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICd1dF9hcmVhJywKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdleHAnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19vX2NvdmlkX2V4cCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX2NvdmlkX2V4cCkKCmBgYAoKCiMjIHByZXZhbGVuY2UgfiBjb25zY2llbnRpb3VzbmVzcwpgYGB7cn0KCm1vZGVsc19jX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2MnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2NfY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2NfY292aWRfZXhwKQoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCm1vZGVsc19lX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2VfY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2VfY292aWRfZXhwKQoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGFncmVlYWJsZW5lc3MKYGBge3J9Cgptb2RlbHNfYV9jb3ZpZF9leHAgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19hJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ3V0X2FyZWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91a19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdleHAnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX2NvdmlkX2V4cCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19hX2NvdmlkX2V4cCkKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBuZXVyb3RpY2lzbQpgYGB7cn0KCm1vZGVsc19uX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX24nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAndXRfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VrX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX25fY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX25fY292aWRfZXhwKQoKYGBgCgojIyBDcmVhdGUgb3ZlcnZpZXcgdGFibGUgCgojIyMgRGVmaW5lIGZ1bmN0aW9uIHRvIGNyZWF0ZSBvdmVydmlldyB0YWJsZXMKYGBge3J9CgpzdW1tYXJ5X3RhYmxlIDwtIGZ1bmN0aW9uKG1vZGVscywgZHZfbmFtZSwgcHJldj1GKXsKCiAgdGVtcF9kZl9jdHJsX21haW4gPC0gTlVMTAogIHRlbXBfZGZfY3RybF9pbnQgPC0gTlVMTAogIHRlbXBfZGZfY3RybF9pbnRfcHJldiA8LSBOVUxMCiAgCiAgZm9yIChpIGluIG1vZGVscyl7CiAgICByZXN1bHRzIDwtIGkgJT4lIGV4dHJhY3RfcmVzdWx0cygpCiAgICAKICAgIHJlc3VsdHNfY3RybF9tYWluIDwtIHJlc3VsdHMkaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbVsnbHZsMV94Omx2bDJfeCcsXQogICAgdGVtcF9kZl9jdHJsX21haW4gPC0gdGVtcF9kZl9jdHJsX21haW4gJT4lIHJiaW5kKHJlc3VsdHNfY3RybF9tYWluKQogICAgCiAgICByZXN1bHRzX2N0cmxfaW50IDwtIHJlc3VsdHMkaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtWydsdmwxX3g6bHZsMl94JyxdCiAgICB0ZW1wX2RmX2N0cmxfaW50IDwtIHRlbXBfZGZfY3RybF9pbnQgJT4lIHJiaW5kKHJlc3VsdHNfY3RybF9pbnQpCiAgICAKICAgIGlmKHByZXYpewogICAgICByZXN1bHRzX2N0cmxfaW50X3ByZXYgPC0gcmVzdWx0cyRpbnRlcmFjdGlvbl9jdHJsX2ludF9wcmV2WydsdmwxX3g6bHZsMl94JyxdCiAgICAgIHRlbXBfZGZfY3RybF9pbnRfcHJldiA8LSB0ZW1wX2RmX2N0cmxfaW50X3ByZXYgJT4lIHJiaW5kKHJlc3VsdHNfY3RybF9pbnRfcHJldikKICAgIH0KICAgICAgICAKICB9CiAgCiAgbmFtZXNfY3RybF9tYWluIDwtIHBhc3RlMChkdl9uYW1lLCAnficsIGMoJ28nLCAnYycsICdlJywgJ2EnLCAnbicpLCAnKnRpbWUnLCAnX2NydGxfcG9wZGVucycpCiAgcm93bmFtZXModGVtcF9kZl9jdHJsX21haW4pIDwtIG5hbWVzX2N0cmxfbWFpbgoKICBuYW1lc19jdHJsX2ludCA8LSBwYXN0ZTAoZHZfbmFtZSwgJ34nLCBjKCdvJywgJ2MnLCAnZScsICdhJywgJ24nKSwgJyp0aW1lJywgJ19jcnRsX3BvcGRlbnMqdGltZScpCiAgcm93bmFtZXModGVtcF9kZl9jdHJsX2ludCkgPC0gbmFtZXNfY3RybF9pbnQKCiAgaWYocHJldil7CiAgICBuYW1lc19jdHJsX2ludF9wcmV2IDwtIHBhc3RlMChkdl9uYW1lLCAnficsIGMoJ28nLCAnYycsICdlJywgJ2EnLCAnbicpLCAnKnRpbWUnLCAnX2NydGxfcG9wZGVucyp0aW1lX3ByZXYnKQogICAgcm93bmFtZXModGVtcF9kZl9jdHJsX2ludF9wcmV2KSA8LSBuYW1lc19jdHJsX2ludF9wcmV2CiAgICAKICAgIHN1bV90YWIgPC0gcmJpbmQodGVtcF9kZl9jdHJsX21haW4sIHRlbXBfZGZfY3RybF9pbnQsIHRlbXBfZGZfY3RybF9pbnRfcHJldikgJT4lIHJvdW5kKDQpCiAgfWVsc2V7CiAgICBzdW1fdGFiIDwtIHJiaW5kKHRlbXBfZGZfY3RybF9tYWluLCB0ZW1wX2RmX2N0cmxfaW50KSAlPiUgcm91bmQoNCkKICB9CgoKICAKICByZXR1cm4oc3VtX3RhYikKCn0gCgpgYGAKCiMjIyBDcmVhdGUgb3ZlcnZpZXcgdGFibGVzCmBgYHtyfQojIHByZXZhbGVuY2UKbW9kZWxzX3ByZXYgPC0gbGlzdChtb2RlbHNfb19jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX2NfY292aWQsIAogICAgICAgICAgICAgICAgICAgIG1vZGVsc19lX2NvdmlkLCAKICAgICAgICAgICAgICAgICAgICBtb2RlbHNfYV9jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX25fY292aWQpCgpzdW1fdGFiX3ByZXYgPC0gc3VtbWFyeV90YWJsZShtb2RlbHNfcHJldiwgZHZfbmFtZSA9ICdwcmV2JykKCndyaXRlLnRhYmxlKHN1bV90YWJfcHJldiwgcXVvdGU9RikKCiMgc29jaWFsIGRpc3RhbmNpbmcKbW9kZWxzX3NvY2Rpc3QgPC0gbGlzdChtb2RlbHNfb19zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfY19zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfZV9zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfYV9zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfbl9zb2NkaXN0KQoKc3VtX3RhYl9zb2NkaXN0IDwtIHN1bW1hcnlfdGFibGUobW9kZWxzX3NvY2Rpc3QsIGR2X25hbWUgPSAnc29jZGlzdCcsIHByZXY9VCkKCndyaXRlLnRhYmxlKHN1bV90YWJfc29jZGlzdCwgcXVvdGU9RikKCgoKYGBgCgoKCiMgQ29uZGl0aW9uYWwgcmFuZG9tIGZvcmVzdCBhbmFseXNpcyAKCiMjIyBFeHRyYWN0IHNsb3BlcyBwcmV2YWxlbmNlCmBgYHtyfQoKIyBzbG9wZSBwcmV2YWxlbmNlCmRmX3VrX3Nsb3BlX3ByZXYgPC0gZGZfdWtfc2NhbGVkICU+JSBzcGxpdCguJHV0X2FyZWEpICU+JSAKICBtYXAofiBsbShyYXRlX2RheSB+IHRpbWUsIGRhdGEgPSAuKSkgJT4lCiAgbWFwKGNvZWYpICU+JSAKICBtYXBfZGJsKCd0aW1lJykgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd1dF9hcmVhJykgJT4lIAogIHJlbmFtZShzbG9wZV9wcmV2ID0gJy4nKQoKIyBtZXJnZSB3aXRoIGNvbnRyb2wgdmFyaWFibGVzIApkZl91a19zbG9wZV9wcmV2IDwtIGRmX3VrX3NjYWxlZCAlPiUgc2VsZWN0KC10aW1lLCAtcmF0ZV9kYXkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGlubmVyX2pvaW4oZGZfdWtfc2xvcGVfcHJldiwgYnkgPSAndXRfYXJlYScpICU+JQogIGRyb3BfbmEoKQoKaGVhZChkZl91a19zbG9wZV9wcmV2KQoKYGBgCgoKIyMjIEV4dHJhY3Qgc2xvcGVzIHNvY2lhbCBkaXN0YW5jaW5nCmBgYHtyfQoKIyBzbG9wZSBzb2NkaXN0CmRmX3VrX3Nsb3BlX3NvY2Rpc3QgPC0gZGZfdWtfc29jZGlzdF9zY2FsZWQgJT4lIHNwbGl0KC4kbnV0czMpICU+JQogIG1hcCh+IGxtKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChjb2VmKSAlPiUKICBtYXBfZGJsKCd0aW1lJykgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbignbnV0czMnKSAlPiUKICByZW5hbWUoc2xvcGVfc29jZGlzdCA9ICcuJykKCiMgbWVyZ2Ugd2l0aCBjb250cm9sIHZhcmlhYmxlcyAKZGZfdWtfc2xvcGVfc29jZGlzdCA8LSBkZl91a19zb2NkaXN0X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtZGF0ZSwgLXNvY2Rpc3RfdGlsZXMsIC1zb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGlubmVyX2pvaW4oZGZfdWtfc2xvcGVfc29jZGlzdCwgYnkgPSAnbnV0czMnKSAlPiUKICBkcm9wX25hKCkKCmhlYWQoZGZfdWtfc2xvcGVfc29jZGlzdCkKCmBgYAoKIyMjIEV4cGxvcmUgZGlzdHJpYnV0aW9uIG9mIHNsb3BlcwpgYGB7cn0KZGZfdWtfc2xvcGVfcHJldiAlPiUgZ2dwbG90KGFlcyhzbG9wZV9wcmV2KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQoKZGZfdWtfc2xvcGVfc29jZGlzdCAlPiUgZ2dwbG90KGFlcyhzbG9wZV9zb2NkaXN0KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQoKYGBgCgpgYGB7cn0KZGZfdWtfc2xvcGVfcHJldgpgYGAKCgojIENSRiBwcmV2YWxlbmNlIH4gb3Blbm5lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX29fZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19vICsgYWlycG9ydF9kaXN0ICsgbWFsZXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBtYW51ZmFjdHVyaW5nICsgdG91cmlzbSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhbHRoICsgYWNhZGVtaWMgKyBtZWRpbmMgKyBtZWRhZ2UgKyBjb25zZXJ2YXRpdmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfdWtfc2xvcGVfcHJldlstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9vX3ZhcmltcF9wcmV2IDwtIHZhcmltcChjcmZfb19maXRfcHJldiwgbnBlcm0gPSAxKQpjcmZfb192YXJpbXBfY29uZF9wcmV2IDwtIHZhcmltcChjcmZfb19maXRfcHJldiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfb192YXJpbXBfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfb192YXJpbXBfY29uZF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBwcmV2YWxlbmNlIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2NfZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19jICsgYWlycG9ydF9kaXN0ICsgbWFsZXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBtYW51ZmFjdHVyaW5nICsgdG91cmlzbSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhbHRoICsgYWNhZGVtaWMgKyBtZWRpbmMgKyBtZWRhZ2UgKyBjb25zZXJ2YXRpdmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfdWtfc2xvcGVfcHJldlstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9jX3ZhcmltcF9wcmV2IDwtIHZhcmltcChjcmZfY19maXRfcHJldiwgbnBlcm0gPSAxKQpjcmZfY192YXJpbXBfY29uZF9wcmV2IDwtIHZhcmltcChjcmZfY19maXRfcHJldiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfY192YXJpbXBfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfY192YXJpbXBfY29uZF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMgQ1JGIHByZXZhbGVuY2UgfiBleHRyYXZlcnNpb24KYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2VfZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19lICsgYWlycG9ydF9kaXN0ICsgbWFsZXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBtYW51ZmFjdHVyaW5nICsgdG91cmlzbSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhbHRoICsgYWNhZGVtaWMgKyBtZWRpbmMgKyBtZWRhZ2UgKyBjb25zZXJ2YXRpdmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfdWtfc2xvcGVfcHJldlstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9lX3ZhcmltcF9wcmV2IDwtIHZhcmltcChjcmZfZV9maXRfcHJldiwgbnBlcm0gPSAxKQpjcmZfZV92YXJpbXBfY29uZF9wcmV2IDwtIHZhcmltcChjcmZfZV9maXRfcHJldiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfZV92YXJpbXBfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfZV92YXJpbXBfY29uZF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMgQ1JGIHByZXZhbGVuY2UgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9hX2ZpdF9wcmV2IDwtIGNmb3Jlc3Qoc2xvcGVfcHJldiB+IHBlcnNfYSArIGFpcnBvcnRfZGlzdCArIG1hbGVzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BkZW5zICsgbWFudWZhY3R1cmluZyArIHRvdXJpc20gKwogICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWx0aCArIGFjYWRlbWljICsgbWVkaW5jICsgbWVkYWdlICsgY29uc2VydmF0aXZlLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX3VrX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfYV92YXJpbXBfcHJldiA8LSB2YXJpbXAoY3JmX2FfZml0X3ByZXYsIG5wZXJtID0gMSkKY3JmX2FfdmFyaW1wX2NvbmRfcHJldiA8LSB2YXJpbXAoY3JmX2FfZml0X3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX2FfdmFyaW1wX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX2FfdmFyaW1wX2NvbmRfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgojIENSRiBwcmV2YWxlbmNlIH4gbmV1cm90aWNpc20KYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX25fZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19uICsgYWlycG9ydF9kaXN0ICsgbWFsZXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBtYW51ZmFjdHVyaW5nICsgdG91cmlzbSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhbHRoICsgYWNhZGVtaWMgKyBtZWRpbmMgKyBtZWRhZ2UgKyBjb25zZXJ2YXRpdmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfdWtfc2xvcGVfcHJldlstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9uX3ZhcmltcF9wcmV2IDwtIHZhcmltcChjcmZfbl9maXRfcHJldiwgbnBlcm0gPSAxKQpjcmZfbl92YXJpbXBfY29uZF9wcmV2IDwtIHZhcmltcChjcmZfbl9maXRfcHJldiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfbl92YXJpbXBfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfbl92YXJpbXBfY29uZF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMgQ1JGIHNvY2lhbCBkaXN0YW5jaW5nIH4gb3Blbm5lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX29fZml0X3NvY2Rpc3QgPC0gY2ZvcmVzdChzbG9wZV9zb2NkaXN0IH4gcGVyc19vICsgYWlycG9ydF9kaXN0ICsgbWFsZXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBtYW51ZmFjdHVyaW5nICsgdG91cmlzbSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhbHRoICsgYWNhZGVtaWMgKyBtZWRpbmMgKyBtZWRhZ2UgKyBjb25zZXJ2YXRpdmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfdWtfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9vX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfb19maXRfc29jZGlzdCwgbnBlcm0gPSAxKQpjcmZfb192YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfb19maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfb192YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfb192YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyBDUkYgc29jaWFsIGRpc3RhbmNpbmcgfiBjb25zY2llbnRpb3VzbmVzcwpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfY19maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX2MgKyBhaXJwb3J0X2Rpc3QgKyBtYWxlcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucyArIG1hbnVmYWN0dXJpbmcgKyB0b3VyaXNtICsKICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFsdGggKyBhY2FkZW1pYyArIG1lZGluYyArIG1lZGFnZSArIGNvbnNlcnZhdGl2ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl91a19zbG9wZV9zb2NkaXN0Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2NfdmFyaW1wX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9jX2ZpdF9zb2NkaXN0LCBucGVybSA9IDEpCmNyZl9jX3ZhcmltcF9jb25kX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9jX2ZpdF9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9jX3ZhcmltcF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9jX3ZhcmltcF9jb25kX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBzb2NpYWwgZGlzdGFuY2luZyB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfZV9maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX2UgKyBhaXJwb3J0X2Rpc3QgKyBtYWxlcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wZGVucyArIG1hbnVmYWN0dXJpbmcgKyB0b3VyaXNtICsKICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFsdGggKyBhY2FkZW1pYyArIG1lZGluYyArIG1lZGFnZSArIGNvbnNlcnZhdGl2ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl91a19zbG9wZV9zb2NkaXN0Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2VfdmFyaW1wX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9lX2ZpdF9zb2NkaXN0LCBucGVybSA9IDEpCmNyZl9lX3ZhcmltcF9jb25kX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9lX2ZpdF9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9lX3ZhcmltcF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9lX3ZhcmltcF9jb25kX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBzb2NpYWwgZGlzdGFuY2luZyB+IGFncmVlYWJsZW5lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2FfZml0X3NvY2Rpc3QgPC0gY2ZvcmVzdChzbG9wZV9zb2NkaXN0IH4gcGVyc19hICsgYWlycG9ydF9kaXN0ICsgbWFsZXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBtYW51ZmFjdHVyaW5nICsgdG91cmlzbSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhbHRoICsgYWNhZGVtaWMgKyBtZWRpbmMgKyBtZWRhZ2UgKyBjb25zZXJ2YXRpdmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfdWtfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9hX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfYV9maXRfc29jZGlzdCwgbnBlcm0gPSAxKQpjcmZfYV92YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfYV9maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfYV92YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfYV92YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMgQ1JGIHNvY2lhbCBkaXN0YW5jaW5nIH4gbmV1cm90aWNpc20KYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX25fZml0X3NvY2Rpc3QgPC0gY2ZvcmVzdChzbG9wZV9zb2NkaXN0IH4gcGVyc19uICsgYWlycG9ydF9kaXN0ICsgbWFsZXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMgKyBtYW51ZmFjdHVyaW5nICsgdG91cmlzbSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhbHRoICsgYWNhZGVtaWMgKyBtZWRpbmMgKyBtZWRhZ2UgKyBjb25zZXJ2YXRpdmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfdWtfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9uX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfbl9maXRfc29jZGlzdCwgbnBlcm0gPSAxKQpjcmZfbl92YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfbl9maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfbl92YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfbl92YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAo=